Godot 4.0: GDScript 2.0
主にその変更点についてこのページでまとめる
2021年9月時点の記事
日本語で以下の機能について紹介されている
code:gd
func exec_callable(f: Callable):
f.call()
Callable オブジェクトの型でメソッドの引数を受け取り、call() できるようになった
高階関数の導入
ラムダ式(無名関数)
var result1 = [1, 2, 3, 4, 5].filter(func (x: int): return x < 3)
func で無名関数をその場で生成して Callable オブジェクトして扱うことが可能になった
例えば引数無しの簡単なプリント文を現すラムダ式は、func(): print("test")
2行に渡る場合は改行すればok
code:gd
tween.tween_callback(func():
print("test")
print("test2")
)
Signal Object
code:gd
signal my_singal(String)
func _ready():
# Godot4
self.my_singal.connect(func(msg: String): print(msg))
self.my_singal.emit("hello, signal!")
signal が class 定義されたオブジェクトとなり、signal.connect()とsignal.emit()メソッドが使えるようになった
今までは文字列でシグナル名を指定していたので、シグナル名の変更に弱かったが、メンバ変数として扱えるのでコンパイルエラーで気付けるようになる
アノテーション機能
https://www.youtube.com/watch?v=l4TqAnt9WEA
tool -> @tool
onready -> @onready
icon -> @icon
export -> @export と、@export_range などオプション付きもある
例
Godot 3
export(float, 5, 20, 0.2) var aaa
Godot 4
export_range(5, 20, 0.2) var aaa
Properties
setget が廃止され、properities が導入された
setgetとは異なり、同じクラスであっても常にsetter/getter が呼び出されるようになった
code:gd
var milliseconds: int = 0
var seconds: int:
get:
return milliseconds / 1000
set(value):
milliseconds = value * 1000
setgetのように関数を指定する書き方もできる
code:gd
var my_prop:
get = get_my_prop, set = set_my_prop
func get_my_prop():
return my_prop
func set_my_prop(value):
my_prop = value
await instead of yield
yieldキーワードは削除され、awaitに変わり、利便性も上がっている
super keyword
こっちのほうが分かりやすい
Remove multi-level calls
ライフサイクル関数(_processや_readyなど)のオーバーライドを作成した場合でも、スーパークラスの実装を暗黙的に呼び出していた挙動があった。また、いくつかの関数はサブクラスより先にスーパークラスを呼び出したり、逆に呼び出したりしていた。
この挙動は取り除かれた。親クラスの実装を呼び出す必要がある場合は、前述した super キーワードを使用する。
Typed arrays
型付き配列が追加された。これは嬉しい。
Pythonライク
var my_array: Array[int] = [1, 2, 3]
int 型のArray
型推論も使える
var inferred_array := [1, 2, 3] # This is Array[int].
注意点として、コンパイル時に検証できない型(動的な型)は、実行時に検証される。
パフォーマンスに若干影響ある
Lambda functions
他のプログラミング言語でおなじみのラムダ関数の追加
code:gd
func _ready():
var my_lambda = func(x):
print(x)
my_lambda.call("hello")
Callable 型であるので、ラムダを実行するには、call()関数を使う
Static methods in built-in types
組み込み型に対する静的メソッドのサポートを追加。
これまでは関数を呼び出すために値を構築する必要があったが、Godot4からは関数を直接呼び出すことができるようになる。
Further optimizations
内部的なパフォーマンス最適化
@Faultun: Godot3だとget_children()で直接の子ノードしかとれなくて、全ての子ノードがとりたければ自前で再帰処理関数を作る必要があるんだけど Godot4ではget_children(true)にすると直接の子ノードだけじゃなくて、すべての子ノードを取得できるようになったよ
これは地味に便利